home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / BARNET / ARMLINUX / REMOUNT-PATCH < prev    next >
Text File  |  1998-09-06  |  2KB  |  68 lines

  1. --- fs/super.c.orig    Mon Aug 18 21:01:15 1997
  2. +++ fs/super.c    Mon Jun  8 22:28:38 1998
  3. @@ -771,21 +771,48 @@
  4.      return 0;
  5.  }
  6.  
  7. -static int do_remount(const char *dir,int flags,char *data)
  8. +static int do_remount(const char *dev, const char *dir,int flags,char *data)
  9.  {
  10.      struct inode *dir_i;
  11.      int retval;
  12.  
  13. -    retval = namei(dir, &dir_i);
  14. -    if (retval)
  15. +    if ((retval = namei(dir, &dir_i)))
  16. +        return retval;
  17. +    if ((retval = do_remount_sb(dir_i->i_sb, flags, data)))
  18.          return retval;
  19.      if (dir_i != dir_i->i_sb->s_mounted) {
  20. +        struct inode *dev_i;
  21. +        struct vfsmount *vfsmnt;
  22. +        if ((retval = namei(dev, &dev_i)))
  23. +            return retval;
  24. +        vfsmnt = lookup_vfsmnt(dev_i->i_rdev);
  25. +        if (!vfsmnt) return 0; /* I dunno... but it's consistent */
  26. +        if (dir_i->i_count != 1 || dir_i->i_mount
  27. +             || dir_i->i_sb->s_dev == dev_i->i_rdev) {
  28. +            iput(dir_i);
  29. +            return -EBUSY;
  30. +        }
  31. +        if (!S_ISDIR(dir_i->i_mode)) {
  32. +            iput(dir_i);
  33. +            return -ENOTDIR;
  34. +        }
  35. +        /* Note that the tests here are not complete.  Nothing
  36. +           stops the incompetent sysadmin remounting /a on /a/b/a
  37. +           if b is a different filesystem.  This would be tricky
  38. +           to implement and probably pointless.  mount(8) would
  39. +           be a better place to put sanity checks, I believe */
  40. +        iput(vfsmnt->mnt_sb->s_covered);
  41. +        vfsmnt->mnt_sb->s_covered->i_mount = NULL;
  42. +        vfsmnt->mnt_sb->s_covered = dir_i;
  43. +        dir_i->i_mount = vfsmnt->mnt_sb->s_mounted;
  44. +        kfree(vfsmnt->mnt_dirname);
  45. +        if ((vfsmnt->mnt_dirname =
  46. +            (char *) kmalloc(strlen(dir)+1, GFP_KERNEL)) != (char *)NULL)
  47. +            strcpy(vfsmnt->mnt_dirname, dir);
  48. +    } else {
  49.          iput(dir_i);
  50. -        return -EINVAL;
  51.      }
  52. -    retval = do_remount_sb(dir_i->i_sb, flags, data);
  53. -    iput(dir_i);
  54. -    return retval;
  55. +    return 0;
  56.  }
  57.  
  58.  static int copy_mount_options (const void * data, unsigned long *where)
  59. @@ -847,7 +874,7 @@
  60.          retval = copy_mount_options (data, &page);
  61.          if (retval < 0)
  62.              return retval;
  63. -        retval = do_remount(dir_name,
  64. +        retval = do_remount(dev_name, dir_name,
  65.                      new_flags & ~MS_MGC_MSK & ~MS_REMOUNT,
  66.                      (char *) page);
  67.          free_page(page);
  68.